package main

import (
	"log"
	"time"

	"github.com/gotk3/gotk3/glib"
	"github.com/gotk3/gotk3/gtk"
)

func main() {
	gtk.Init(nil)
	win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
	if err != nil {
		log.Fatal("无法创建窗口：", err)
	}
	win.SetDefaultSize(500, 200)
	win.SetTitle("消息对话框示例")
	win.Connect("destroy", func() {
		gtk.MainQuit()
	})
	msgLbl, err := gtk.LabelNew("")
	if err != nil {
		log.Fatal("无法创建 msgLbl：", err)
	}
	submitBtn, err := gtk.ButtonNew()
	if err != nil {
		log.Fatal("无法创建 submitBtn:", err)
	}
	submitBtn.SetLabel("提交")
	submitBtn.Connect("clicked", func() {
		workDlg := gtk.MessageDialogNew(win, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, "%s", "运行中...")
		go func() {
			showWorkDlgChan := make(chan bool)
			go showWorkDlg(workDlg, showWorkDlgChan)
			<-showWorkDlgChan

			time.Sleep(1 * time.Second) // This is here for testing only

			msgChan := make(chan string)
			go getMsg(msgChan)
			msg := <-msgChan

			msgLblChan := make(chan bool)
			go setMsgLbl(msgLbl, msg, msgLblChan)
			<-msgLblChan

			destroyWorkDlgChan := make(chan bool, 1)
			go destroyWorkDlg(workDlg, destroyWorkDlgChan)
			<-destroyWorkDlgChan
		}()
	})
	mainBox, err := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 6)
	if err != nil {
		log.Fatal("无法创建主框：", err)
	}
	mainBox.PackStart(msgLbl, false, false, 0)
	mainBox.PackStart(submitBtn, false, false, 0)
	win.Add(mainBox)
	win.ShowAll()
	gtk.Main()
}

func showWorkDlg(dlg *gtk.MessageDialog, done chan bool) {
	r := glib.IdleAdd(dlg.Show)
	if r == 0 {
		log.Fatal("无法执行 IdleAdd()：")
	}
	done <- true
}

func getMsg(msgChan chan string) {
	now := time.Now()
	hms := now.Format("15:04:05")
	msgChan <- hms
}

func setMsgLbl(msgLbl *gtk.Label, msg string, msgLblChan chan bool) {
	msgLbl.SetText(msg)
	r := glib.IdleAdd(msg)
	if r == 0 {
		log.Fatal("无法执行 IdleAdd()：")
	}
	msgLblChan <- true
}

func destroyWorkDlg(dlg *gtk.MessageDialog, done chan bool) {
	r := glib.IdleAdd(dlg.Destroy)
	if r == 0 {
		log.Fatal("无法执行 IdleAdd()：")
	}
	done <- true
}

//func msgDlgNoChannels() {
//	gtk.Init(nil)
//	win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
//	if err != nil {
//		log.Fatal("Unable to create window:", err)
//	}
//	win.SetDefaultSize(500, 200)
//	win.SetTitle("MessageDialog Example")
//	win.Connect("destroy", func() {
//		gtk.MainQuit()
//	})
//	msgLbl, err := gtk.LabelNew("")
//	if err != nil {
//		log.Fatal("Unable to create msgLbl:", err)
//	}
//	submitBtn, err := gtk.ButtonNew()
//	if err != nil {
//		log.Fatal("Unable to create submitBtn:", err)
//	}
//	submitBtn.SetLabel("Submit")
//	submitBtn.Connect("clicked", func() {
//		go func() {
//			workingDlg := gtk.MessageDialogNew(win, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, "%s", "Working...")
//			r := glib.IdleAdd(workingDlg.Show)
//			if r==0 {
//				log.Fatal("无法执行 IdleAdd()：", err)
//			}
//			msgChan := make(chan string)
//			msg := getMsg(msgChan)
//			time.Sleep(1 * time.Second) // This is here only for testing
//			r2 := glib.IdleAdd(msgLbl.SetText, msg)
//			if r2==0 {
//				log.Fatal("无法执行 IdleAdd()：")
//			}
//			r3 := glib.IdleAdd(workingDlg.Destroy)
//			if r3==0 {
//				log.Fatal("无法执行 IdleAdd()：")
//			}
//		}()
//	})
//	mainBox, err := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 6)
//	if err != nil {
//		log.Fatal("Unable to create mainBox:", err)
//	}
//	mainBox.PackStart(msgLbl, false, false, 0)
//	mainBox.PackStart(submitBtn, false, false, 0)
//	win.Add(mainBox)
//	win.ShowAll()
//	gtk.Main()
//}
//func msgDlgOneChannel() {
//	gtk.Init(nil)
//	win, err := gtk.WindowNew(gtk.WINDOW_TOPLEVEL)
//	if err != nil {
//		log.Fatal("无法创建窗口：", err)
//	}
//	win.SetDefaultSize(500, 200)
//	win.SetTitle("消息对话框示例")
//	win.Connect("destroy", func() {
//		gtk.MainQuit()
//	})
//	msgLbl, err := gtk.LabelNew("")
//	if err != nil {
//		log.Fatal("无法创建 msgLbl：", err)
//	}
//	submitBtn, err := gtk.ButtonNew()
//	if err != nil {
//		log.Fatal("无法创建 submitBtn:", err)
//	}
//	submitBtn.SetLabel("Submit")
//	submitBtn.Connect("clicked", func() {
//		workDlg := gtk.MessageDialogNew(win, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_NONE, "%s", "Working...")
//		go func() {
//			sourceHandle := glib.IdleAdd(workDlg.Show)//源句柄
//			fmt.Println(sourceHandle)
//
//			time.Sleep(1 * time.Second) // 这里仅供测试
//			msgChan := make(chan string)
//			go getMsg(msgChan)
//			msg := <-msgChan
//			msgLbl.SetText(msg)
//			sourceHandle2 := glib.IdleAdd(msgLbl)
//			fmt.Println(sourceHandle2)
//			sourceHandle3 := glib.IdleAdd(workDlg.Destroy)
//			fmt.Println("无法执行 IdleAdd():", sourceHandle3)
//		}()
//	})
//	mainBox, err := gtk.BoxNew(gtk.ORIENTATION_VERTICAL, 6)
//	if err != nil {
//		log.Fatal("无法创建主框：", err)
//	}
//	mainBox.PackStart(msgLbl, false, false, 0)
//	mainBox.PackStart(submitBtn, false, false, 0)
//	win.Add(mainBox)
//	win.ShowAll()
//	gtk.Main()
//}
